package com.fufu.thread;

/**
 * 探究线程安全
 * @author: BlcakTiger
 * @date: 2023/2/11 21:24
 * @contact: hsf6661@163.com
 */
public class ThreadSafe {

    public static void main(String[] args) {
        //创建person实例
        Person person = new Person();
        //创建第一个线程，用于执行person的add()方法
        Thread th1 = new Thread(()->{
            person.add(1);
        });
        //创建第二个线程，也用于执行person的add()方法
        Thread th2 = new Thread(()->{
            person.add(1);
        });

        /*
        * 两个线程同时执行person的add()方法，一般情况而言，会存在安全隐患
        * 对于非原子性操作的代码块，可能会引发数据紊乱的问题，对于包含这种操作的类，我们说它是线程不安全的
        * 而下面的Person中，对其每个方法都使用synchronized锁住了非原子操作，锁的识别对象为当前实例，故而多个线程
        * 调用对象的同一个实例不会出现数据紊乱的清空，因而这是一个线程安全的类
        * */

    }


}

/**
 * 写一个线程安全的类
 */
class Person{

    private int count = 0;

    public void add(int n){
        synchronized(this){
            count += n;
        }
    }

    /**
     * 这种写法与上面的写法功能相同，使用synchronized标识的方法为同步方法
     * 且默认锁的实例为this
     * @param n
     */
    public synchronized void dec(int n){
            count -= n;

    }

}
